package org.xx.armory.commons;

import static org.apache.commons.text.StringEscapeUtils.escapeJson;
import static org.xx.armory.commons.Validators.notBlank;
import static org.xx.armory.commons.Validators.notNull;

/**
 * 包含一对名字和值的对象。
 */
@Immutable
public final class NameObject {
    private final String name;
    private final Object object;

    /**
     * 构造一对名字和值。
     *
     * <p>名字不能是{@code null}或者只包含空白字符。值不能是{@code null}。</p>
     *
     * @param name
     *         名字，自动去掉首尾空格。
     * @param object
     *         值。
     * @throws IllegalArgumentException
     *         如果参数{@code name}是{@code null}或者只包含空白字符，如果参数{@code object}是{@code null}。
     */
    public NameObject(
            String name,
            Object object
    ) {
        this.name = notBlank(name, "name").trim();
        this.object = notNull(object, "object");
    }

    /**
     * 获取名字。
     *
     * @return 名字。
     */
    public final String getName() {
        return this.name;
    }

    /**
     * 获取值。
     *
     * @return 值。
     */
    public final Object getObject() {
        return this.object;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public final int hashCode() {
        return this.name.hashCode();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public final boolean equals(
            Object obj
    ) {
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof NameObject)) {
            return false;
        }
        final NameObject other = (NameObject) obj;
        return other.name.equals(this.name) && other.object.equals(this.object);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public final String toString() {
        return "{name=\"" + escapeJson(this.name) + ",object=\"" + escapeJson(this.object.toString()) + "\",type=" + this.object.getClass().getSimpleName() + "}";
    }
}
